<html>
  <head>
    <title>
      订阅、处理分布式事件
    </title>
  </head>
  <body>
    <script>
    
 /*
                        三、订阅分布式事件

                                    服务可以实现IDistributedEventHandler<TEvent>来处理事件。

                                    eg: 处理上面定义的StockCountChangedEto

                                            using System.Threading.Tasks;
                                            using Volo.Abp.DependencyInjection;
                                            using Volo.Abp.EventBus.Distributed;

                                            namespace AbpDemo
                                            {
                                                public class MyHandler
                                                    : IDistributedEventHandler<StockCountChangedEto>,  // 实现分布式事件处理程序接口(泛型)
                                                    ITransientDependency
                                                {
                                                    public async Task HandleEventAsync(StockCountChangedEto eventData)
                                                    {
                                                        var productId = eventData.ProductId;
                                                    }
                                                }
                                            } 

                                            MyHandler被ABP自动发现，并且每当发生StockCountChangedEto事件时，都会调用HandleEventAsync

                                            如果你使用分布式消息代理，例如RabbitMQ，ABP会自动订阅消息代理上的事件，获取消息，执行处理程序。

                                            如果事件处理程序成功执行（没有抛出任何异常），它会向消息代理发送确认（确认字符）。

                                    你可以在这里注入任何服务并执行任何所需的逻辑。

                                    单个事件处理程序类可以订阅多个事件，但为每种事件类型实现IDistributedEventHandler<TEvent>接口。


                                    如果你执行数据库操作并使用事件处理程序内的存储库，你可能需要创建一个工作单元，因为服务中是没有工作单元的，它不是控制器的一部分。

                                    此时，把处理方法定义为 virtual,并为该方法加上 [UnitOfWork]特性，或者手动使用 IUnitOfWorkManager创建一个工作单元。

                                    ★、事件处理程序必须注册到IOC容器中！！
                                    
                    */

    </script>
  </body>
</html>